package main

import "fmt"

/*
  模版方法模式
  允许把对象不同的部分抽象，在同一段代码中执行相同的逻辑，增加可拓展性。
  在Go语言中，实现由底层对象实现，而行为由顶层方法控制
  例子 A B 模板
*/

//模板
type Template interface {
	DoSomething()
	DoAnything()
}

//A
type TemplateA struct {
}

func (t TemplateA) DoSomething()  {
	fmt.Println("A do something")
}

func (t TemplateA) DoAnything() {
	fmt.Println("A do Anything")
}

//B
type TemplateB struct {
}

func (t TemplateB) DoSomething()  {
	fmt.Println("B do something")
}

func (t TemplateB) DoAnything()  {
	fmt.Println("B do anything")
}

func Operate(temp Template)  {
	temp.DoSomething()
	temp.DoAnything()
}

func main() {
	a := TemplateA{}
	b := TemplateB{}
	Operate(a)
	Operate(b)
}
